package com.chen.system.controller;

import com.chen.common.result.Result;
import com.chen.common.utils.JwtHelper;
import com.chen.common.utils.MD5;
import com.chen.model.system.SysUser;
import com.chen.model.vo.LoginVo;
import com.chen.system.exception.ChenException;
import com.chen.system.service.SysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Y·C
 * @version 1.0.0
 * @ClassName IndexController.java
 * @Description TODO
 * @createTime 2023年04月03日 20:54:00
 */


/**
 * 第一种方式：HttpSession 缺点在分布式时，session无法实现共享
 * 第二种方式：使用token 什么是token 按照约定规则生成一个字符串，字符串进行编码加密处理
 * token如何共享
 * 每次登陆，登录成功之后，返回生成token字符串
 * 每次把返回token放到cookie里面（cookie不能跨域传递）
 * 每次发送请求携带这个token发送（把token值放到请求头）
 * */

@Api(tags = "用户登录接口")
@RestController
@RequestMapping("/admin/system/index")
public class IndexController {

    @Autowired
    private SysUserService sysUserService;

    @ApiOperation("用户登录接口")
    @PostMapping("login")
    public Result login(@RequestBody LoginVo loginVo){
        //根据username查询数据
        SysUser sysUser = sysUserService.getUserInfoByUserName(loginVo.getUsername());
        //如果查询为空
        if (sysUser == null){
            throw  new ChenException(2001,"用户不存在");
        }
        //判断密码是否一致
        String password = loginVo.getPassword();
        String md5Password = MD5.encrypt(password);
        if (!sysUser.getPassword().equals(md5Password)){
            throw new ChenException(2001,"密码不正确");
        }
        //判断用户名是否可用
        if (sysUser.getStatus().intValue() == 0){
            throw new ChenException(2001,"用户已经被禁用");
        }
        //根据userid和username生成token字符串，通过map返回
        String token = JwtHelper.createToken(sysUser.getId(), sysUser.getUsername());

        Map<String,Object> map = new HashMap<>();
        map.put("token",token);

        return Result.ok(map);
    }


    //    {"code":20000,"data":{"roles":["admin"],
//        "introduction":"I am a super administrator",
//                "avatar":"https://wpimg.walls tcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif",
//                "name":"Super Admin"}}

    @ApiOperation("登录之后获取用户信息接口")
    @GetMapping("info")
    public Result info(HttpServletRequest request){
        //获取请求头token字符串
        String token = request.getHeader("token");

        //从token字符串获取用户名称（id）
        String username = JwtHelper.getUsername(token);

        //根据用户名称获取用户信息（基本信息 和 菜单权限 和 按钮权限数据）
        Map <String,Object> map = sysUserService.getUserInfo(username);
        return Result.ok(map);
    }

}
